package com.shujia.reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class Demo2Gen {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        /*
         * 泛型
         *
         * 1、限制类型
         * 2、让代码变得更通用
         *
         */

        ArrayList<String> list = new ArrayList<String>();


        Test<Integer> test = new Test<Integer>();

        test.print(1);
        test.print1("java");


        /*
         *
         * 泛型和反射
         *
         * 反射在运行是起作用
         *
         *
         * 泛型编译是起作用
         */


        ArrayList<String> list1 = new ArrayList<>();

        list1.add("java");
        //list1.add(1);

        System.out.println(list1);

        //可以通过反射绕过泛型对类型的限制
        //1、获取arrayList的类对象
        Class<ArrayList> listClass = ArrayList.class;


        //2、获取add方法
        Method add = listClass.getMethod("add", Object.class);

        //3、调用add方法
        add.invoke(list1, 1000);

        System.out.println(list1);


        //ClassCastException  类型转换异常
//        /*for (String s : list1) {
//            s.split(",");
//        }*/


    }
}

/**
 * T  是一个不确定的类型
 * <p>
 * 泛型类
 */
class Test<T> {

    public void print(T a) {
        System.out.println(a);
    }

    /**
     * 泛型方法
     */
    public <E> void print1(E b) {
        System.out.println(b);
    }

}

